// 路由鉴权:鉴权,项目中路由能不能被权限的设置(某一个路由什么条件下可以访问,什么条件下不能访问)
import router from "@/router";

import pinia from "@/stores";
import { use_user_store } from "@/stores/user-store";

const user_store = use_user_store(pinia);

// 登录后发送请求获取用户信息(保证没有token也可以发送请求获取)

// 全局前置守卫:项目中任意路由切换都会触发的钩子
router.beforeEach(async (to: any, _: any, next: any) => {
  // 访问某一个路由之前的守卫
  // to:将要访问哪个路由
  // from:从哪个路由而来
  // next:路由的放行函数
  // 用户登录判断
  if (!!user_store.token) {
    // 登陆成功判断
    if (to.path == "/login") {
      next({ path: "/" });
    } else {
      if (user_store.user_info) {
        next();
      } else {
        // 如果没有用户信息,在守卫处发请求获取用户信息
        try {
          await user_store.get_user_info();
          next({ ...to, replace: true });
        } catch (err) {
          // token过期或者用户手动地修改了本地的token
          await user_store.user_logout();
          next({ path: "/login", query: { redirect: to.path } });
        }
      }
    }
  } else {
    // 用户未登录判断
    if (to.path == "/login") next();
    else {
      next({ path: "/login", query: { redirect: to.path } });
    }
  }
});
